home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / russell / gc32.lha / mach_dep.c < prev    next >
C/C++ Source or Header  |  1993-07-14  |  8KB  |  222 lines

  1. # include "gc_private.h"
  2. # include <stdio.h>
  3. # include <setjmp.h>
  4. # ifdef OS2
  5. #   define _setjmp(b) setjmp(b)
  6. #   define _longjmp(b,v) longjmp(b,v)
  7. # endif
  8.  
  9. /* Routine to mark from registers that are preserved by the C compiler. */
  10. /* This must be ported to every new architecture.  There is a generic   */
  11. /* version at the end, that is likely, but not guaranteed to work       */
  12. /* on your architecture.  Run the test_setjmp program to see whether    */
  13. /* there is any chance it will work.                                    */
  14. GC_push_regs()
  15. {
  16. #       ifdef RT
  17.       register long TMP_SP; /* must be bound to r11 */
  18. #       endif
  19. #       ifdef VAX
  20.     /* VAX - generic code below does not work under 4.2 */
  21.       /* r1 through r5 are caller save, and therefore     */
  22.       /* on the stack or dead.                            */
  23.       asm("pushl r11");     asm("calls $1,_GC_push_one");
  24.       asm("pushl r10");     asm("calls $1,_GC_push_one");
  25.       asm("pushl r9");    asm("calls $1,_GC_push_one");
  26.       asm("pushl r8");    asm("calls $1,_GC_push_one");
  27.       asm("pushl r7");    asm("calls $1,_GC_push_one");
  28.       asm("pushl r6");    asm("calls $1,_GC_push_one");
  29. #       endif
  30. #       if defined(M68K) && defined(SUNOS)
  31.     /*  M68K SUNOS - could be replaced by generic code */
  32.       /* a0, a1 and d1 are caller save          */
  33.       /*  and therefore are on stack or dead.   */
  34.     
  35.       asm("subqw #0x4,sp");        /* allocate word on top of stack */
  36.  
  37.       asm("movl a2,sp@");    asm("jbsr _GC_push_one");
  38.       asm("movl a3,sp@");    asm("jbsr _GC_push_one");
  39.       asm("movl a4,sp@");    asm("jbsr _GC_push_one");
  40.       asm("movl a5,sp@");    asm("jbsr _GC_push_one");
  41.       /* Skip frame pointer and stack pointer */
  42.       asm("movl d1,sp@");    asm("jbsr _GC_push_one");
  43.       asm("movl d2,sp@");    asm("jbsr _GC_push_one");
  44.       asm("movl d3,sp@");    asm("jbsr _GC_push_one");
  45.       asm("movl d4,sp@");    asm("jbsr _GC_push_one");
  46.       asm("movl d5,sp@");    asm("jbsr _GC_push_one");
  47.       asm("movl d6,sp@");    asm("jbsr _GC_push_one");
  48.       asm("movl d7,sp@");    asm("jbsr _GC_push_one");
  49.  
  50.       asm("addqw #0x4,sp");        /* put stack back where it was    */
  51. #       endif
  52.  
  53. #       if defined(M68K) && defined(HP)
  54.     /*  M68K HP - could be replaced by generic code */
  55.       /* a0, a1 and d1 are caller save.  */
  56.     
  57.       asm("subq.w &0x4,%sp");    /* allocate word on top of stack */
  58.  
  59.       asm("mov.l %a2,(%sp)"); asm("jsr _GC_push_one");
  60.       asm("mov.l %a3,(%sp)"); asm("jsr _GC_push_one");
  61.       asm("mov.l %a4,(%sp)"); asm("jsr _GC_push_one");
  62.       asm("mov.l %a5,(%sp)"); asm("jsr _GC_push_one");
  63.       /* Skip frame pointer and stack pointer */
  64.       asm("mov.l %d1,(%sp)"); asm("jsr _GC_push_one");
  65.       asm("mov.l %d2,(%sp)"); asm("jsr _GC_push_one");
  66.       asm("mov.l %d3,(%sp)"); asm("jsr _GC_push_one");
  67.       asm("mov.l %d4,(%sp)"); asm("jsr _GC_push_one");
  68.       asm("mov.l %d5,(%sp)"); asm("jsr _GC_push_one");
  69.       asm("mov.l %d6,(%sp)"); asm("jsr _GC_push_one");
  70.       asm("mov.l %d7,(%sp)"); asm("jsr _GC_push_one");
  71.  
  72.       asm("addq.w &0x4,%sp");    /* put stack back where it was    */
  73. #       endif /* M68K HP */
  74.  
  75. #       if defined(I386) && !defined(OS2) && !defined(SUNOS5)
  76.     /* I386 code, generic code does not appear to work */
  77.     /* It does appear to work under OS2, and asms dont */
  78.       asm("pushl %eax");  asm("call _GC_push_one"); asm("addl $4,%esp");
  79.       asm("pushl %ecx");  asm("call _GC_push_one"); asm("addl $4,%esp");
  80.       asm("pushl %edx");  asm("call _GC_push_one"); asm("addl $4,%esp");
  81.       asm("pushl %esi");  asm("call _GC_push_one"); asm("addl $4,%esp");
  82.       asm("pushl %edi");  asm("call _GC_push_one"); asm("addl $4,%esp");
  83.       asm("pushl %ebx");  asm("call _GC_push_one"); asm("addl $4,%esp");
  84. #       endif
  85.  
  86. #       if defined(I386) && defined(SUNOS5)
  87.     /* I386 code, generic code does not appear to work */
  88.     /* It does appear to work under OS2, and asms dont */
  89.       asm("pushl %eax");  asm("call GC_push_one"); asm("addl $4,%esp");
  90.       asm("pushl %ecx");  asm("call GC_push_one"); asm("addl $4,%esp");
  91.       asm("pushl %edx");  asm("call GC_push_one"); asm("addl $4,%esp");
  92.       asm("pushl %esi");  asm("call GC_push_one"); asm("addl $4,%esp");
  93.       asm("pushl %edi");  asm("call GC_push_one"); asm("addl $4,%esp");
  94.       asm("pushl %ebx");  asm("call GC_push_one"); asm("addl $4,%esp");
  95. #       endif
  96.  
  97. #       ifdef NS32K
  98.       asm ("movd r3, tos"); asm ("bsr ?_GC_push_one"); asm ("adjspb $-4");
  99.       asm ("movd r4, tos"); asm ("bsr ?_GC_push_one"); asm ("adjspb $-4");
  100.       asm ("movd r5, tos"); asm ("bsr ?_GC_push_one"); asm ("adjspb $-4");
  101.       asm ("movd r6, tos"); asm ("bsr ?_GC_push_one"); asm ("adjspb $-4");
  102.       asm ("movd r7, tos"); asm ("bsr ?_GC_push_one"); asm ("adjspb $-4");
  103. #       endif
  104.  
  105. #       ifdef SPARC
  106.       {
  107.           void GC_save_regs_in_stack();
  108.           
  109.           /* generic code will not work */
  110.           GC_save_regs_in_stack();
  111.       }
  112. #       endif
  113.  
  114. #    ifdef RT
  115.         GC_push_one(TMP_SP);    /* GC_push_one from r11 */
  116.  
  117.         asm("cas r11, r6, r0"); GC_push_one(TMP_SP);    /* r6 */
  118.         asm("cas r11, r7, r0"); GC_push_one(TMP_SP);    /* through */
  119.         asm("cas r11, r8, r0"); GC_push_one(TMP_SP);    /* r10 */
  120.         asm("cas r11, r9, r0"); GC_push_one(TMP_SP);
  121.         asm("cas r11, r10, r0"); GC_push_one(TMP_SP);
  122.  
  123.         asm("cas r11, r12, r0"); GC_push_one(TMP_SP); /* r12 */
  124.         asm("cas r11, r13, r0"); GC_push_one(TMP_SP); /* through */
  125.         asm("cas r11, r14, r0"); GC_push_one(TMP_SP); /* r15 */
  126.         asm("cas r11, r15, r0"); GC_push_one(TMP_SP);
  127. #       endif
  128.  
  129. #       if defined(M68K) && defined(SYSV)
  130.       /*  Once again similar to SUN and HP, though setjmp appears to work.
  131.           --Parag
  132.        */
  133. #        ifdef __GNUC__
  134.         asm("subqw #0x4,%sp");    /* allocate word on top of stack */
  135.   
  136.         asm("movl %a2,%sp@");    asm("jbsr GC_push_one");
  137.         asm("movl %a3,%sp@");    asm("jbsr GC_push_one");
  138.         asm("movl %a4,%sp@");    asm("jbsr GC_push_one");
  139.         asm("movl %a5,%sp@");    asm("jbsr GC_push_one");
  140.         /* Skip frame pointer and stack pointer */
  141.         asm("movl %d1,%sp@");    asm("jbsr GC_push_one");
  142.         asm("movl %d2,%sp@");    asm("jbsr GC_push_one");
  143.         asm("movl %d3,%sp@");    asm("jbsr GC_push_one");
  144.         asm("movl %d4,%sp@");    asm("jbsr GC_push_one");
  145.         asm("movl %d5,%sp@");    asm("jbsr GC_push_one");
  146.         asm("movl %d6,%sp@");    asm("jbsr GC_push_one");
  147.         asm("movl %d7,%sp@");    asm("jbsr GC_push_one");
  148.   
  149.         asm("addqw #0x4,%sp");    /* put stack back where it was    */
  150. #        else /* !__GNUC__*/
  151.         asm("subq.w &0x4,%sp");    /* allocate word on top of stack */
  152.   
  153.         asm("mov.l %a2,(%sp)"); asm("jsr GC_push_one");
  154.         asm("mov.l %a3,(%sp)"); asm("jsr GC_push_one");
  155.         asm("mov.l %a4,(%sp)"); asm("jsr GC_push_one");
  156.         asm("mov.l %a5,(%sp)"); asm("jsr GC_push_one");
  157.         /* Skip frame pointer and stack pointer */
  158.         asm("mov.l %d1,(%sp)"); asm("jsr GC_push_one");
  159.         asm("mov.l %d2,(%sp)"); asm("jsr GC_push_one");
  160.         asm("mov.l %d3,(%sp)"); asm("jsr GC_push_one");
  161.         asm("mov.l %d4,(%sp)"); asm("jsr GC_push_one");
  162.         asm("mov.l %d5,(%sp)"); asm("jsr GC_push_one");
  163.          asm("mov.l %d6,(%sp)"); asm("jsr GC_push_one");
  164.         asm("mov.l %d7,(%sp)"); asm("jsr GC_push_one");
  165.   
  166.         asm("addq.w &0x4,%sp");    /* put stack back where it was    */
  167. #        endif /* !__GNUC__ */
  168. #       endif /* M68K/SYSV */
  169.  
  170.  
  171. #     if defined(HP_PA) || (defined(I386) && defined(OS2))
  172.     /* Generic code                          */
  173.     /* The idea is due to Parag Patel at HP. */
  174.     /* We're not sure whether he would like  */
  175.     /* to be he acknowledged for it or not.  */
  176.     {
  177.         static jmp_buf regs;
  178.         register word * i = (word *) regs;
  179.         register ptr_t lim = (ptr_t)(regs) + (sizeof regs);
  180.  
  181.         /* Setjmp on Sun 3s doesn't clear all of the buffer.  */
  182.         /* That tends to preserve garbage.  Clear it.         */
  183.         for (; (char *)i < lim; i++) {
  184.             *i = 0;
  185.         }
  186.         (void) _setjmp(regs);
  187.         GC_push_all_stack((ptr_t)regs, lim);
  188.     }
  189. #     endif
  190.  
  191.       /* other machines... */
  192. #       if !(defined M68K) && !(defined VAX) && !(defined RT) 
  193. #    if !(defined SPARC) && !(defined I386) &&!(defined NS32K)
  194. #    if !defined(HP_PA)
  195.         --> bad news <--
  196. #       endif
  197. #       endif
  198. #       endif
  199. }
  200.  
  201. /* On register window machines, we need a way to force registers into     */
  202. /* the stack.                                */
  203. # ifdef SPARC
  204.     asm("    .seg     \"text\"");
  205. #   ifdef SUNOS5
  206.       asm("    .globl    GC_save_regs_in_stack");
  207.       asm("GC_save_regs_in_stack:");
  208. #   else
  209.       asm("    .globl    _GC_save_regs_in_stack");
  210.       asm("_GC_save_regs_in_stack:");
  211. #   endif
  212.     asm("    ta    0x3   ! ST_FLUSH_WINDOWS");
  213.     asm("    mov    %sp,%o0");
  214.     asm("    retl");
  215.     asm("    nop");
  216.     
  217. #   ifdef LINT
  218.     void GC_save_regs_in_stack() {}
  219. #   endif
  220. # endif
  221.  
  222.